package com.hspedu.reflection.question;


import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 反射问题的引入
 */
@SuppressWarnings("all")
public class ReflectionQuestion {
    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //传统方式
//        Cat cat = new Cat();
//        cat.hi();

        //1、使用 Properties 类，读写配置文件
        Properties properties = new Properties();

        properties.load(new FileInputStream("src\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString(); // "com.hspedu.Cat"
        String methodName = properties.get("method").toString();
        System.out.println("classfullpath=" + classfullpath);
        System.out.println("method=" + methodName);

        //2、创建对象  传统的方法行不通 ==》  反射机制
//        new classfullpath();

        //3、使用反射机制解决
        //(1) 加载类，返回Class类型的对象aClass
        Class aClass = Class.forName(classfullpath);
        //（2）通过 aClass 得到你加载的类  com.hspedu.Cat 的对象实例
        Object o = aClass.newInstance();
        System.out.println("o的运行类型：" + o.getClass());  //运行类型

        //（3）通过 aClass 得到你加载的类  com.hspedu.Cat 的 methodName 的方法对象
        // 在反射中 可以把 方法 视为 对象（万物皆对象）
        Method method = aClass.getMethod(methodName);
        //（4）通过 method 调用方法，即 通过方法对象调用方法
        System.out.println("===============================");
        method.invoke(o); //传统方法：对象.方法()   反射机制：方法.invoke(对象)
    }

}
